home *** CD-ROM | disk | FTP | other *** search
/ Assassins - Ultimate CD Games Collection 4 / Assassins 4 (1999)(Weird Science).iso / misc / omega / source / house.c < prev    next >
C/C++ Source or Header  |  1997-05-02  |  6KB  |  239 lines

  1. /* omega copyright (C) by Laurence Raphael Brothers, 1987,1988,1989 */
  2. /* house.c */
  3. /* some functions to make the house levels */
  4.  
  5. #include "glob.h"
  6.  
  7.  
  8. /* loads the house level into Level*/
  9. void load_house(kind, populate)
  10. int kind;
  11. int populate;
  12. {
  13.   int i,j;
  14.   char site;
  15.   int stops;
  16.   
  17.   FILE *fd;
  18.  
  19.   TempLevel = Level;
  20.   initrand(Current_Environment, Player.x + Player.y + hour()*10);
  21.   if (ok_to_free(TempLevel)) {
  22. #ifndef SAVE_LEVELS
  23.     free_level(TempLevel);
  24. #endif
  25.     TempLevel = NULL;
  26.   }
  27. #ifndef SAVE_LEVELS
  28.   Level = ((plv) checkmalloc(sizeof(levtype)));
  29. #else
  30.   msdos_changelevel(TempLevel,0,-1);
  31.   Level = &TheLevel;
  32. #endif
  33.   clear_level(Level);
  34.   strcpy(Str3,Omegalib);
  35.   switch(kind) {
  36.   case E_HOUSE:
  37.     strcat(Str3,"home1.dat");
  38.     Level->environment = E_HOUSE;
  39.     site = cryptkey("home1.dat");
  40.     break;
  41.   case E_MANSION:
  42.     strcat(Str3,"home2.dat");
  43.     Level->environment = E_MANSION;
  44.     site = cryptkey("home2.dat");
  45.     break;
  46.   default:
  47.   case E_HOVEL:
  48.     strcat(Str3,"home3.dat");
  49.     Level->environment = E_HOVEL;
  50.     site = cryptkey("home3.dat");
  51.     break;
  52.   }
  53.   fd = checkfopen(Str3,"rb");
  54.   stops = 0;
  55.   for(j=0;j<LENGTH;j++) {
  56.     for(i=0;i<WIDTH;i++) {
  57.       if (kind == E_HOVEL) Level->site[i][j].lstatus = SEEN;
  58.       else Level->site[i][j].lstatus = 0;
  59.       Level->site[i][j].roomnumber = RS_CORRIDOR;
  60.       Level->site[i][j].p_locf = L_NO_OP;
  61.       site = getc(fd)^site;
  62.       switch(site) {
  63.       case 'N':
  64.     Level->site[i][j].locchar = FLOOR;
  65.     Level->site[i][j].roomnumber = RS_BEDROOM;
  66.     if (random_range(2) && populate) make_house_npc(i,j);
  67.     break;
  68.       case 'H':
  69.     Level->site[i][j].locchar = FLOOR;
  70.     Level->site[i][j].roomnumber = RS_BEDROOM;
  71.     if (random_range(2) && populate) make_mansion_npc(i,j);
  72.     break;
  73.       case 'D':
  74.     Level->site[i][j].locchar = FLOOR;
  75.     Level->site[i][j].roomnumber = RS_DININGROOM;
  76.     break;
  77.       case '.':
  78.     Level->site[i][j].locchar = FLOOR;
  79.     if (stops) {
  80.       lset(i,j,STOPS);
  81.       stops = 0;
  82.     }
  83.     break;
  84.       case 'c':
  85.     Level->site[i][j].locchar = FLOOR;
  86.     Level->site[i][j].roomnumber = RS_CLOSET;
  87.     break;
  88.       case 'G':
  89.     Level->site[i][j].locchar = FLOOR;
  90.     Level->site[i][j].roomnumber = RS_BATHROOM;
  91.     break;
  92.       case 'B':
  93.     Level->site[i][j].locchar = FLOOR;
  94.     Level->site[i][j].roomnumber = RS_BEDROOM;
  95.     break;
  96.       case 'K':
  97.     Level->site[i][j].locchar = FLOOR;
  98.     Level->site[i][j].roomnumber = RS_KITCHEN;
  99.     break;
  100.       case 'S':
  101.     Level->site[i][j].locchar = FLOOR;
  102.     Level->site[i][j].showchar = WALL;
  103.     lset(i,j,SECRET);
  104.     Level->site[i][j].roomnumber = RS_SECRETPASSAGE;
  105.     break;
  106.       case '3':
  107.     Level->site[i][j].locchar = SAFE;
  108.     Level->site[i][j].showchar = WALL;
  109.     lset(i,j,SECRET);
  110.     Level->site[i][j].p_locf = L_SAFE;
  111.     break;
  112.       case '^':
  113.     Level->site[i][j].locchar = FLOOR;
  114.     Level->site[i][j].p_locf = TRAP_BASE+random_range(NUMTRAPS);
  115.     break;
  116.       case 'P':
  117.     Level->site[i][j].locchar = PORTCULLIS;
  118.     Level->site[i][j].p_locf = L_PORTCULLIS;
  119.     break;
  120.       case 'R':
  121.     Level->site[i][j].locchar = FLOOR;
  122.     Level->site[i][j].p_locf = L_RAISE_PORTCULLIS;
  123.     break;
  124.       case 'p':
  125.     Level->site[i][j].locchar = FLOOR;
  126.     Level->site[i][j].p_locf = L_PORTCULLIS;
  127.     break;
  128.       case 'T':
  129.     Level->site[i][j].locchar = FLOOR;
  130.     Level->site[i][j].p_locf = L_PORTCULLIS_TRAP;
  131.     break;
  132.       case 'X':
  133.     Level->site[i][j].locchar = FLOOR;
  134.     Level->site[i][j].p_locf = L_HOUSE_EXIT;
  135.     stops = 1;
  136.     break;
  137.       case '#':
  138.     Level->site[i][j].locchar = WALL;
  139.     switch (kind) {
  140.     case E_HOVEL: Level->site[i][j].aux = 10; break;
  141.     case E_HOUSE: Level->site[i][j].aux = 50; break;
  142.     case E_MANSION: Level->site[i][j].aux = 150; break;
  143.     }
  144.     break;
  145.       case '|':
  146.     Level->site[i][j].locchar = OPEN_DOOR;
  147.     Level->site[i][j].roomnumber = RS_CORRIDOR;
  148.     lset(i,j,STOPS);
  149.     break;
  150.       case '+':
  151.     Level->site[i][j].locchar = CLOSED_DOOR;
  152.     Level->site[i][j].roomnumber = RS_CORRIDOR;
  153.     Level->site[i][j].aux = LOCKED;
  154.     lset(i,j,STOPS);
  155.     break;
  156.       case 'd':
  157.     Level->site[i][j].locchar = FLOOR;
  158.     Level->site[i][j].roomnumber = RS_CORRIDOR;
  159.     if (populate)
  160.       make_site_monster(i,j,ML4+10); /* dog */
  161.     break;
  162.       case 'a':
  163.     Level->site[i][j].locchar = FLOOR;
  164.     Level->site[i][j].roomnumber = RS_CORRIDOR;
  165.     Level->site[i][j].p_locf = L_TRAP_SIREN;
  166.     break;
  167.       case 'A':
  168.     Level->site[i][j].locchar = FLOOR;
  169.     Level->site[i][j].roomnumber = RS_CORRIDOR;
  170.     if (populate)
  171.       make_site_monster(i,j,ML4+2); /* automaton */
  172.     break;
  173.       }
  174.       Level->site[i][j].showchar = ' ';
  175.     }
  176.     site = getc(fd)^site;
  177.   }
  178.   fclose(fd);
  179.   initrand(-2, 0);
  180. }
  181.  
  182.  
  183.   
  184. /* makes a log npc for houses and hovels */
  185. void make_house_npc(i,j)
  186. int i,j;
  187. {
  188.   pml ml = ((pml) checkmalloc(sizeof(mltype)));
  189.   pob ob;
  190.   ml->m = ((pmt) checkmalloc(sizeof(montype)));
  191.   *(ml->m) = Monsters[NPC];
  192.   make_log_npc(ml->m);
  193.   if (ml->m->id == NPC) mprint("You detect signs of life in this house.");
  194.   else mprint("An eerie shiver runs down your spine as you enter....");
  195.   /* if not == NPC, then we got a ghost off the npc list */
  196.   ml->m->x = i;
  197.   ml->m->y = j;
  198.   Level->site[i][j].creature = ml->m;
  199.   ml->m->click = (Tick + 1) % 50;
  200.   ml->next = Level->mlist;
  201.   Level->mlist = ml;
  202.   m_status_set(ml->m,HOSTILE);
  203.   if (nighttime())
  204.     m_status_reset(ml->m,AWAKE);
  205.   else m_status_set(ml->m,AWAKE);
  206.   if (ml->m->startthing > -1) {
  207.     ob = ((pob) checkmalloc(sizeof(objtype)));    
  208.     *ob = Objects[ml->m->startthing];
  209.     m_pickup(ml->m,ob);
  210.   }
  211. }
  212.  
  213.  
  214.  
  215.  
  216.  
  217. /* makes a hiscore npc for mansions */
  218. void make_mansion_npc(i,j)
  219. int i,j;
  220. {
  221.   pml ml = ((pml) checkmalloc(sizeof(mltype)));
  222.   ml->m = ((pmt) checkmalloc(sizeof(montype)));
  223.   *(ml->m) = Monsters[NPC];
  224.   make_hiscore_npc(ml->m,random_range(14) + 1);
  225.   mprint("You detect signs of life in this house.");
  226.   ml->m->x = i;
  227.   ml->m->y = j;
  228.   Level->site[i][j].creature = ml->m;
  229.   ml->m->click = (Tick + 1) % 50;
  230.   ml->next = Level->mlist;
  231.   Level->mlist = ml;
  232.   m_status_set(ml->m,HOSTILE);
  233.   if (nighttime())
  234.     m_status_reset(ml->m,AWAKE);
  235.   else m_status_set(ml->m,AWAKE);
  236. }
  237.  
  238.  
  239.